<%@page import="java.util.List"%>
<%@page import="util.PointFactory"%>
<%@page import="com.vividsolutions.jts.geom.Point"%>
<%@page import="view.PontoGastronomicoBean"%>
<%@page import="controller.PontoGastronomicoController"%>
<%@page import="com.google.gson.Gson"%>
<%@page import="com.google.gson.GsonBuilder"%>
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
<%
    // Obtém os argumentos da query (vindos da requisição ajax)
    String latitude = request.getParameter("latitude");
    String longitude = request.getParameter("longitude");
    String distanciaMax = request.getParameter("distanciaMax");
    String precoMax = request.getParameter("precoMax");
    String arrayTipos = request.getParameter("tipos");
    String arrayEstilos = request.getParameter("estilos");
    String horarioAbertura = request.getParameter("abertura");
    String horarioFechamento = request.getParameter("fechamento");
    String avaliacaoMin = request.getParameter("avaliacao");
    String descricao = request.getParameter("descricao");
    String abertos = request.getParameter("somenteAbertos");

    // Faz as conversões de tipo necessárias
    Point pontoPartida = PointFactory.create(Double.parseDouble(latitude), Double.parseDouble(longitude));
    int distanciaMaxima = Integer.parseInt(distanciaMax);
    float precoMaximo = Float.parseFloat(precoMax);
    float avaliacaoMinima = Float.parseFloat(avaliacaoMin);
    boolean somenteAbertos = Boolean.parseBoolean(abertos);

    // Converte arrays vazios e strings vazias em null
    if (arrayTipos.isEmpty())
        arrayTipos = null;
    if (arrayEstilos.isEmpty())
        arrayEstilos = null;
    if (horarioAbertura.isEmpty())
        horarioAbertura = null;
    if (horarioFechamento.isEmpty())
        horarioFechamento = null;
    if (descricao.isEmpty())
        descricao = null;

    // Realiza a consulta, obtendo uma lista de resultados (pontos)
    List<PontoGastronomicoBean> resultadosQuery = new PontoGastronomicoController()
        .recuperar(arrayTipos, arrayEstilos, pontoPartida, distanciaMaxima, precoMaximo,
            descricao, horarioAbertura, horarioFechamento, avaliacaoMinima, somenteAbertos);
    int numResults = resultadosQuery.size();

    // Constrói o objeto JSON representando os resultados
    Gson gson = new GsonBuilder()
        .serializeNulls()
        .serializeSpecialFloatingPointValues()
        .create();
    StringBuilder json = new StringBuilder();
    json.append("{\"stat\":");
    json.append(numResults);
    json.append(",\"results\":");
    json.append(gson.toJson(resultadosQuery).replaceAll("NaN", "0"));
    json.append("}");

    // Torna o objeto disponível
    out.print(json.toString());    
%>
